c76ce91
@@ -394,19 +394,18 @@
private boolean generateSemiJoinOperatorPlan(DynamicListContext ctx, ParseContex
     // we need the expr that generated the key of the reduce sink
     ExprNodeDesc key = ctx.generator.getConf().getKeyCols().get(ctx.desc.getKeyIndex());
 
-    if (parentOfRS instanceof SelectOperator) {
-      // Make sure the semijoin branch is not on parition column.
-      String internalColName = null;
-      ExprNodeDesc exprNodeDesc = key;
-      // Find the ExprNodeColumnDesc
-      while (!(exprNodeDesc instanceof ExprNodeColumnDesc) &&
-              (exprNodeDesc.getChildren() != null)) {
-        exprNodeDesc = exprNodeDesc.getChildren().get(0);
-      }
-
-      if (exprNodeDesc instanceof ExprNodeColumnDesc) {
-        internalColName = ((ExprNodeColumnDesc) exprNodeDesc).getColumn();
+    String internalColName = null;
+    ExprNodeDesc exprNodeDesc = key;
+    // Find the ExprNodeColumnDesc
+    while (!(exprNodeDesc instanceof ExprNodeColumnDesc) &&
+            (exprNodeDesc.getChildren() != null)) {
+      exprNodeDesc = exprNodeDesc.getChildren().get(0);
+    }
 
+    if (exprNodeDesc instanceof ExprNodeColumnDesc) {
+      internalColName = ((ExprNodeColumnDesc) exprNodeDesc).getColumn();
+      if (parentOfRS instanceof SelectOperator) {
+        // Make sure the semijoin branch is not on parition column.
         ExprNodeColumnDesc colExpr = ((ExprNodeColumnDesc) (parentOfRS.
                 getColumnExprMap().get(internalColName)));
         String colName = ExprNodeDescUtils.extractColName(colExpr);
@@ -423,12 +422,13 @@
private boolean generateSemiJoinOperatorPlan(DynamicListContext ctx, ParseContex
           // The column is partition column, skip the optimization.
           return false;
         }
-      } else {
-        // No column found!
-        // Bail out
-        return false;
       }
+    } else {
+      // No column found!
+      // Bail out
+      return false;
     }
+
     List<ExprNodeDesc> keyExprs = new ArrayList<ExprNodeDesc>();
     keyExprs.add(key);
 
@@ -438,9 +438,32 @@
private boolean generateSemiJoinOperatorPlan(DynamicListContext ctx, ParseContex
 
     // project the relevant key column
     SelectDesc select = new SelectDesc(keyExprs, outputNames);
+
+    // Create the new RowSchema for the projected column
+    ColumnInfo columnInfo = parentOfRS.getSchema().getColumnInfo(internalColName);
+    ArrayList<ColumnInfo> signature = new ArrayList<ColumnInfo>();
+    signature.add(columnInfo);
+    RowSchema rowSchema = new RowSchema(signature);
+
+    // Create the column expr map
+    Map<String, ExprNodeDesc> colExprMap = new HashMap<String, ExprNodeDesc>();
+    ExprNodeDesc exprNode = null;
+    if ( parentOfRS.getColumnExprMap() != null) {
+      exprNode = parentOfRS.getColumnExprMap().get(internalColName).clone();
+    } else {
+      exprNode = new ExprNodeColumnDesc(columnInfo);
+    }
+
+    if (exprNode instanceof ExprNodeColumnDesc) {
+      ExprNodeColumnDesc encd = (ExprNodeColumnDesc) exprNode;
+      encd.setColumn(internalColName);
+    }
+    colExprMap.put(internalColName, exprNode);
+
+    // Create the Select Operator
     SelectOperator selectOp =
             (SelectOperator) OperatorFactory.getAndMakeChild(select,
-                    new RowSchema(parentOfRS.getSchema()), parentOfRS);
+                    rowSchema, colExprMap, parentOfRS);
 
     // do a group by to aggregate min,max and bloom filter.
     float groupByMemoryUsage =
